package com.pi.tcp.handler;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

/**
 * @author chenmfa
 * @date 创建时间: 2017-3-30 下午4:50:06
 * @description
 */
public class ByteDecoder extends ByteToMessageDecoder{
  
  private static final Logger logger = LoggerFactory.getLogger(ByteDecoder.class);
  /**
    * @param buf 注： buf是是个字节数组,对应的：
    * @description 第1位值254
    * @description 第2位值2  (包头 FE 02)
    * @description 第3位值 当前消息类型有0x04(人员推送消息) 0x07(锁具推送消息) 0xF1(WIFI测试消息)
    * @description 第6位是设备锁类型
    * @description 第7位到12位是设备的MAC地址
    * @description 第27位表明- 对于人员消息推送: 2是密码，1为指纹  对于锁具推送：撬锁代码:0x01 假锁代码:0x02 禁试代码:0x03
    * @description 第32位：0-普通开门, 15-开通亲情功能, 240|255-报警功能
    * @description 第33到38位 锁具时间(不准确)
    * @description 对于需要返回实时数据或者其他的ctx.writeAndFlush只能返回ByteBuf、DatagramPacket和AddressedEnvelope类型的数据
    */
  @Override
  protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List<Object> out)
      throws Exception {
    this.setSingleDecode(true);
    logger.info("开始接受数据"+((null == buf)?"0":buf.readableBytes()));
    if(null != buf && buf.readableBytes()>0){
      //读取对端传入数据
      int msgLength = buf.readableBytes();
      byte[] msgByte = new byte[msgLength];
      buf.readBytes(msgByte);
      StringBuilder sb = new StringBuilder();
      //获取数据长度
      sb.append("接受到数据bao chang du " + msgLength +": ");
      for (int c = 0; c < msgByte.length; c++) {
        sb.append(String.format("%02x ", msgByte[c] & 0xFF));
      }
    }else{
      logger.error("传入buf 为空");
      ctx.write("传入数据为空");
    }    
  }
  
  @Override
  public void channelInactive(ChannelHandlerContext ctx){   
    ctx.close();
  }
  
}
